﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LarDosIdosos.Business.Model;
using LarDosIdosos.NewAcessaDados;
using MySql.Data.MySqlClient;

namespace LarDosIdosos.Business
{
    public class DBResponsavel
    {
        private string _stringConnection;

        public DBResponsavel(string stringDeConexao)
        {
            _stringConnection = stringDeConexao;
        }

        public List<Responsavel> SelectResponsaveis(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                var reader = conn.ExecuteDataReader(sql);
                if (reader.HasRows)
                {
                    return MontaListaDeResponsaveis(reader);
                }
                return new List<Responsavel>();
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível consultar o tipo documento", ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        public Responsavel SelectResponsavel(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                var reader = conn.ExecuteDataReader(sql);
                if(reader.Read())
                {
                    return MontaResponsavel(reader);
                }
                return null;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível consultar o tipo documento", ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        public int Count(string sql)
        {
            var conn = new AcessaDados(_stringConnection);
            try
            {
                int i = 0;
                conn.OpenConnection();
                var reader = conn.ExecuteDataReader(sql);
                while (reader.Read())
                {
                    i++;
                }
                return i;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível consultar o tipo documento", ex);
            }
            finally
            {
                conn.CloseConection();
            }
            
        }

        private List<Responsavel> MontaListaDeResponsaveis(MySqlDataReader reader)
        {
            List<Responsavel> responsaveis = new List<Responsavel>();
            while(reader.Read())
            {
                responsaveis.Add(MontaResponsavel(reader));
            }
            return responsaveis;
        }

        private Responsavel MontaResponsavel(MySqlDataReader reader)
        {
            Responsavel responsavel = new Responsavel();
            responsavel.Codigo_Responsavel = Convert.ToInt32(reader["Codigo_Responsavel"]);
            responsavel.Estado_Civil = BuscaEstadoCivil(Convert.ToInt32(reader["Estado_Civil_Codigo_Estado_Civil"]));
            responsavel.Nome_Responsavel = reader["Nome_Responsavel"].ToString();
            responsavel.CPF_Responsavel = reader["CPF_Responsavel"].ToString();
            responsavel.RG_Responsavel = reader["RG_Responsavel"].ToString();
            responsavel.Telefones_Responsavel = ObtemTelefones(reader["codigo_responsavel"].ToString());
            responsavel.Data_de_Nascimento_Responsavel = Convert.ToDateTime(reader["Data_de_Nascimento_Responsavel"]);
            responsavel.Nome_do_Pai_Responsavel = reader["Nome_do_Pai_Responsavel"].ToString();
            responsavel.Nome_da_Mae_Responsavel = reader["Nome_da_Mae_Responsavel"].ToString();


            return responsavel;
        }

        private List<Telefone> ObtemTelefones(string codigo_responsavel)
        {
            DBTelefone dbTelefone = new DBTelefone(_stringConnection);
            string sql =
                string.Format(
                    "select Codigo_Telefone, Numero_Telefone from telefone where Responsavel_Codigo_Responsavel = {0}", codigo_responsavel);
            return dbTelefone.SelectTelefones(sql);
        }

        private EstadoCivil BuscaEstadoCivil(int Codigo_Estado_Civil)
        {
            DBEstadoCivil dbEstadoCivil = new DBEstadoCivil(_stringConnection);
            return dbEstadoCivil.BuscaEstadoCivil(Codigo_Estado_Civil);
        }

        public int UpdateResponsavel(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                int updated = conn.ExecuteNonQuery(sql);
                return updated;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível executar a query: " + sql, ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        public int InsertResponsavel(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                int updated = conn.ExecuteNonQuery(sql);
                return updated;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível executa a query: " + sql, ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        public int DeleteResponsavel(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                int updated = conn.ExecuteNonQuery(sql);
                return updated;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível executar a query: " + sql, ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        public List<Idoso> BuscaIdosos(int codigoResponsavel)
        {
            DBIdosos dbIdosos = new DBIdosos(_stringConnection);
            return dbIdosos.BuscaIdososDoResponsavel(codigoResponsavel);
        }

        public List<Responsavel> BuscaResponsaveisDoIdoso(int codigoIdoso)
        {
            string sql = string.Format("select * from responsavel INNER JOIN responsavel_has_idoso on responsavel.Codigo_Responsavel = responsavel_has_idoso.Responsavel_Codigo_Responsavel where responsavel_has_idoso.Idoso_codigo_Idoso = {0}", codigoIdoso);
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                var reader = conn.ExecuteDataReader(sql);
                if (reader.HasRows)
                {
                    return MontaListaDeResponsaveisComGrauDeParentesco(reader);
                }
                return new List<Responsavel>();
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível consultar o tipo documento", ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        private List<Responsavel> MontaListaDeResponsaveisComGrauDeParentesco(MySqlDataReader reader)
        {
            List<Responsavel> responsaveis = new List<Responsavel>();
            while (reader.Read())
            {
                responsaveis.Add(MontaResponsavelComGrauDeParentesco(reader));
            }
            return responsaveis;
        }

        private Responsavel MontaResponsavelComGrauDeParentesco(MySqlDataReader reader)
        {
            Responsavel responsavel = new Responsavel();
            responsavel.Codigo_Responsavel = Convert.ToInt32(reader["Codigo_Responsavel"]);
            responsavel.Estado_Civil = BuscaEstadoCivil(Convert.ToInt32(reader["Estado_Civil_Codigo_Estado_Civil"]));
            responsavel.Nome_Responsavel = reader["Nome_Responsavel"].ToString();
            responsavel.CPF_Responsavel = reader["CPF_Responsavel"].ToString();
            responsavel.RG_Responsavel = reader["RG_Responsavel"].ToString();
            responsavel.Data_de_Nascimento_Responsavel = Convert.ToDateTime(reader["Data_de_Nascimento_Responsavel"]);
            responsavel.Nome_do_Pai_Responsavel = reader["Nome_do_Pai_Responsavel"].ToString();
            responsavel.Nome_da_Mae_Responsavel = reader["Nome_da_Mae_Responsavel"].ToString();
            responsavel.Grau_de_Parentesco = reader["Grau_De_Parentesco_Responsavel_Com_Idoso"].ToString();

            return responsavel;
        }

        public List<Telefone> BuscaTelefones(int codigoResponsavel)
        {
            DBTelefone dbTelefone = new DBTelefone(_stringConnection);
            string sql =
                string.Format(
                    "select Codigo_Telefone, Numero_Telefone from telefone where Responsavel_Codigo_Responsavel = {0}", codigoResponsavel);
            return dbTelefone.SelectTelefones(sql);
        }
    }
}
